package com.swq.java.code.chapter10.code01;

class Base {
    static int a = 1;

    static {
        System.out.println("init Base");
    }
}

class Sub extends Base {
    // final常量会在编译期算出，直接调用不会初始化
//    static final int b = 500*300;
    static int b = 1;

    static {
        System.out.println("init Sub");
    }
}

public class InitTester {

    static {
        System.out.println("init InitTester");
    }

/*
  public static void main(String args[]){
    System.out.println("b="+Sub.b);  //执行这行代码时，先依次初始化Base类和Sub类
  }
*/

    // 类的加载和初始化只包括java命令的部分，不包括javac编译命令的部分，所以加载之前的前提是已经准备好了class文件
    public static void main(String args[]) {
        Base base;  //不会初始化Base类
        System.out.println("After defining base");
        // 初始化子类之前会先初始化父类
//        Sub sub = new Sub();
        base = new Base();  //执行这行代码时，初始化Base类
        System.out.println("After creating an object of Base");
        System.out.println("a=" + base.a);
        System.out.println("b=" + Sub.b);  //执行这行代码时，仅仅初始化Sub类
    }

}